import urllib.request
from bs4 import BeautifulSoup as bs
import re
import xlwt
import os

# 设置全局变量
# 电影名称
find_name = re.compile(r'<span class="title">(.*?)</span>')
# 电影播放地址链接
find_link = re.compile(r'<a href="(.*?)">')
# 电影评分
find_score = re.compile(r'<span class="rating_num".*>(.*?)</span>')
# 评分人数
find_num = re.compile(r'<span>(\d*人)评价</span>')
# 名句
find_inq = re.compile(r'<span class="inq">(.*?)</span>')

# 获取html信息


def ask_html(url):
    ua = {
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49',
    }

    r = urllib.request.Request(url, headers=ua)
    try:
        resp = urllib.request.urlopen(r)
        html = resp.read().decode('utf-8')
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    # print(r.read().decode('utf-8'))
    return html


# 获取数据
def save_data(baseurl):
    data_list = []
    for i in range(0, 10):
        # url = baseurl+str(i*25)  # 网页自动翻页
        current_url = f"{baseurl}?start={i*25}"  # 当前工作页面的网址
        html = ask_html(current_url)  # 保存获取到的数据
        soup = bs(html, "html.parser")
        # print(soup.prettify())
        for item in soup.find_all('div', class_="item"):
            data = []
            # 将正则表达式提取的内容赋值给自定义变量
            CN_EN_name_list = re.findall(find_name, str(item))
            # print(type(CN_EN_name_list))
            # print(CN_EN_name_list)
            # print(len(CN_EN_name_list))
            if len(CN_EN_name_list) == 2:  # 如果有外文名
                # 中英文名合并
                movie_name = str(
                    CN_EN_name_list[0])+str(CN_EN_name_list[1]).replace('\xa0/\xa0', '(')+')'
            else:
                movie_name = str(CN_EN_name_list[0])
            print(movie_name)

            file_num = str(re.findall(find_num, str(item))[0])
            file_link = str(re.findall(find_link, str(item))[0])
            file_score = str(re.findall(find_score, str(item))[0])

            file_inq = re.findall(find_inq, str(item))
            if file_inq:  # 如果有名言
                file_inq = str(file_inq[0])
            # 将所有需要的数据保存到data列表
            data.append(movie_name)
            data.append(file_link)
            data.append(file_num)
            data.append(file_score)
            data.append(file_inq)

            # 写入data（单条电影信息）列表到总的 data_list（所有电影信息）列表
            data_list.append(data)
    return data_list


def save_excel(data_list, save_path):
    # 创建一个xlwt对象，使用utf-8编码格式
    excel = xlwt.Workbook(encoding='utf-8')
    # 创建一个工作表，命名为top250
    sheet = excel.add_sheet('top250')

    # 设置前五列的列宽
    width_c = [256*50, 256*40, 256*10, 256*7, 256*68]
    for i in range(0, 5):
        sheet.col(i).width = width_c[i]

    # 表格各列的列名
    titles = ['电影名称', '电影链接', '评论数', '评分', '电影名言']
    index = 0
    # 将标题写入excel
    for title in titles:
        # (单元格行序号，单元格列序号，单元格的内容，单元格样式)
        sheet.write(0, index, title)
        index += 1

    # 将数据写入excel
    index_r = 1
    # 从多条电影中每次取出一条
    for data in data_list:
        index_c = 0
        # 从一条电影中每次取出一个属性
        for item in data:
            # 前三列设置居中对齐
            if index_c <= 2:
                sheet.write(index_r, index_c, item)
            # 后三列设置默认对齐，即左对齐
            else:
                sheet.write(index_r, index_c, item)
            index_c += 1
        index_r += 1

    # 保存excel文件到指定路径
    excel.save(save_path)
# 保存数据


def main():
    url = 'https://movie.douban.com/top250'
    # html = ask_html(url)
    # data_list = save_data(html)
    data_list = save_data(url)

    savepath = os.getcwd() + r'\top250.xls'
    save_excel(data_list, savepath)


if __name__ == "__main__":
    main()
